package com.liulei.controller;


import com.liulei.entities.Worker;
import com.liulei.service.WorkerService;
import com.sun.corba.se.spi.orbutil.threadpool.Work;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

@Controller
@RequestMapping("/worker")
@Slf4j
public class WorkerController {

    @Autowired
    private WorkerService workerService;

    /**
     * 从yml配置文件中读取服务器存放上传图像的路径
     */
    @Value("${location}")
    private String location;

    /**
     * 用户点击侧边栏的“客户管理”，处理该请求，i将所有的客户信息
     * 渲染到“客户列表”页面。最后返回：客户列表“页面
     * @param model
     * @return 返回”客户列表"页面
     */

    @RequestMapping("/workerList")
    public String listWorker(Model model) {
        List<Worker> workerList = workerService.listWorker();
        model.addAttribute("workerList",workerList);
        return "workerList";
    }

    /**
     * 点击“送水工列表”页面的：添加“按钮，跳转到”添加客户“页面
     */
    @RequestMapping("/preSaveWorker")
    public String preSaveWorker() {
        return "workerSave";
    }

    /**
     * 在“添加送水工”页面的表单填写要添加的送水工信息，点击“提交”按钮，处理添加送水工的请求
     * 步骤：
     * 1 调用Worker Service对象的saveWorker添加送水工信息
     * 2 重定向到送水工列表，显示新添加的送水工信息
     * @param worker 表单采集的送水工对象
     * @return 送水工列表，显示添加的新送水工信息
     */

    /**
     添加送水工信息
     步骤：
     1 将浏览器选择的图像上传到服务器指定的路径
     1.1 获取上传文件的名称
     1.2 获取上传文件后缀的索引
     1.3 获取上传文件的后缀，例如：.png
     1.4 获取上传文件的前缀。前缀的格式为：1970-01-01距离现在的纳秒数。例如：1565634653563456
     1.5 拼接上传文件的前缀和后缀，例如：1565634653563456.png
     1.6 创建服务器存放浏览器上传文件的File对象
     1.7 判断File对象的物理路径是否存在，如果不存在就创建该路径
     1.8 创建上传文件的File对象
     1.9 调用MultipartFile对象的transferTo方法上传文件。
     1.10 将上传文件名称设置到Worker对象中
     2 调用workerService对象的saveWorker方法，将送水工信息持久化到数据库
     3 重定向到送水工列表，显示新增加的送水工信息

     * @param worker 送水工信息
     * @param file  封装了浏览器选择的送水工图像
     * @return
     */
    @RequestMapping(value = "/saveWorker",method = RequestMethod.POST)
    public String saveWorker(Worker worker, MultipartFile file) {
        //条件成立：表示用户在浏览器上传了图像
        uploadImg(worker, file);
        workerService.saveWorker(worker);
        //添加成功之后重新查询客户列表，显示新添加的客户信息
        return "redirect:/worker/workerList";
    }

    private void uploadImg(Worker worker, MultipartFile file) {
        if(null != file) {
            //获取上传文件的名称
            String fileName = file.getOriginalFilename();
            //获取上传文件的后缀的索引
            int index = fileName.lastIndexOf(".");
            //获取上传的文件的后缀，例如：.png
            String suffix = fileName.substring(index);
            //返回1970-1-1距离现在的毫秒数作为上传文件的前缀
            //例如：15465465464
            long prefix = System.nanoTime();
            //拼接上传文件的前缀和后缀，例如15465465464.png
            String uploadFileName = prefix + suffix;
            //创建服务器存放在浏览器上传文件的File对象        }
            File uploadFile = new File(location);
            //条件成立：表示表格路径不存在，在服务器磁盘上创建路径
            if (!uploadFile.exists()) {
                uploadFile.mkdirs();
            }
            //创建上传文件的File对象
            File path = new File(uploadFile, uploadFileName);
            try {
                file.transferTo(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
            worker.setWorkerImage(uploadFileName);
        }
    }

    /**
     * 在浏览器上输入要搜索的“送水工名称”，点击“搜索按钮”，根据条件搜索满足条件的送水工，将送水工列表显示到前端页面
     * 步骤：
     * 1 调用WorkerService对象的searchCustomer方法根据送水工名称搜索满足条件的送水工
     * 2 将送水工列表渲染到前端(送水工列表)页面
     * 3 跳转到送水工列表页面
     * @param workerName 送水工名称
     * @param model
     * @return
     */

    @RequestMapping("/searchWorker")
    public String searchWorker(String workerName,Model model) {
        List<Worker> workerList = workerService.searchWorker(workerName);
        model.addAttribute("workerList",workerList);
        model.addAttribute("searchName",workerName);
        return "workerList";
    }

    /**
     * 处理删除请求
     * 步骤：
     * 1 调用workerService对象的deleteWorkerById方法根据送水工ID删除客户信息
     * 2 打印受影响行数
     * 3 返回送水工列表路径，重新执行查询送水工列表方法listWorker，显示删除之后的数据
     * @param wid 前端传入的送水工id
     * @return 返回送水工列表路径，重新执行查询送水工列表方法listWorker，显示删除之后的数据
     */

    @RequestMapping("/delWorker/{wid}")
    public String deleteWorker(@PathVariable("wid") Integer wid) {
        log.info("delete Worker wid = " + wid);
        int rows = workerService.deleteWorkerById(wid);
        log.info("delete worker rows = " + rows);
        return "redirect:/worker/workerList";
    }

    /**
     * 在页面上点击“修改”按钮，完成数据回显
     * 步骤：
     * 1 根据ID查询对应的客户信息
     * 2 将客户信息渲染到“修改客户”页面
     * 3 返回“修改客户”页面
     * @param wid 送水工id
     * @param model
     * @return 修改送水工
     */
    @RequestMapping("/preUpdateWorker/{wid}")
    public String preUpdateWorker(@PathVariable("wid")Integer wid,Model model) {
        log.info("pre update worker wid = "+wid);
        Worker worker = workerService.getWorkerById(wid);
        model.addAttribute("worker",worker);
        return "workerUpdate";
    }

    /**
     * 在“修改送水工”页面点击“提交”按钮，修改送水工信息，将修改的信息持久化到数据库
     * @param worker 送水工信息
     * @param file 封装了要上传文件的信息
     * @return 送水工列表请求路径，重新查询已修改的送水工信息
     */
    @RequestMapping(value = "/workerUpdate",method = RequestMethod.POST)
    public String updateWorker(Worker worker,MultipartFile file) {
        uploadImg(worker, file);
        int rows = workerService.updateWorker(worker);
        log.info("worker update rows = "+rows);
        return "redirect:/worker/workerList";
    }
    /**
     处理"调增工资"的请求
     @ResponseBody表示将Java对象转换为json格式的数据
     */
    @RequestMapping(value = "/adjustSalary",method = RequestMethod.POST)
    @ResponseBody
    public String adjustWorkerSalary(Integer wid,Integer workerSalary) {
        int rows = workerService.adjustSalary(wid,workerSalary);
        if (rows > 0) {
            return "OK";
        } else {
            return "Fail";
        }
    }

    /**
     处理"减工资"的请求
     @ResponseBody表示将Java对象转换为json格式的数据
     */
    @RequestMapping(value = "/reduceSalary",method = RequestMethod.POST)
    @ResponseBody
    public String reduceWorkerSalary(Integer wid,Integer workerSalary) {
        int rows = workerService.reduceSalary(wid, workerSalary);
        if (rows > 0) {
            return "OK";
        } else {
            return "Fail";
        }
    }
}
